package me.twoday.library.mine.common.base;

import java.io.Serializable;

import me.twoday.library.mine.common.LoggerUtil;
import me.twoday.library.mine.common.MessageUtil;
import me.twoday.library.mine.common.SharedUtil;
import android.app.TabActivity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcelable;
import android.widget.TabHost;

/**
 * 모든 텝을 사용하는 Activity들이 상속해서 사용하는 부모형 헬퍼클래스  
 * 사용법은 해당 클래스를 상속한후 add()만 추가하면됨
 * 예) addTab("notice", "공지사항", UnivInfoNoticeCategoryActivity.class);
 * 
 * @author 김학성
 * @since 2012. 4. 21.
 */
public class BaseTabActivity extends TabActivity 
{
	protected String TAG;
	protected LoggerUtil LOG;
	private TabHost mTabHost;
	private Bundle mBaseExtras;
	private Bundle mReceivedExtras;
	
	public BaseTabActivity()
	{
		this.TAG = getClassName(this.getClass());
		this.LOG = LoggerUtil.getInstance(TAG);
	}
	
	/**
	 * 최초로 탭엑티비티를 추가해 줍니다.
	 *
	 * @param savedInstanceState 기본 상태
	 * @param layoutResource 추가되는 activity layout resource ID
	 */
	protected void onCreate(Bundle savedInstanceState, int layoutResource) 
	{
		super.onCreate(savedInstanceState);
		setContentView(layoutResource);
		BaseApplication.pushActivityStack(this);
		this.mReceivedExtras = getIntent().getExtras();
		this.mBaseExtras = new Bundle();
		mTabHost = getTabHost();
	}
	
	public TabHost getParentTabHost()
	{
		return mTabHost;
	}
	/**
	 * 텝 초기 화면 설명 
	 *
	 */
	public void setCurrentTab() 
	{
		mTabHost.setCurrentTab(0);
	}
	
	@Override
	protected void onDestroy() 
	{
		BaseApplication.popActivityStack(this);
		super.onDestroy();
	}
	
	/**
	 * 아이콘이 있는 텝을 추가 합니다. 
	 *
	 * @param tag 텝을 구별하기 위한 태그 
	 * @param icon 탭에 보여지는 아이콘 
	 * @param label 탭에 보여지는 라벨(문자열	)
	 * @param cls 호출되는 엑티비티 클래스 
	 */
	public void addTab(String tag, int icon, String label, Class<?> cls)
	{
		mTabHost.addTab(mTabHost.newTabSpec(tag)
				.setIndicator(label, getResources().getDrawable(icon))
				.setContent(new Intent(this, cls)));
	}
	
	/**
	 * 아이콘이 없는 텝을 추가 합니다. 
	 *
	 * @param tag 텝을 구별하기 위한 태그 
	 * @param label 탭에 보여지는 라벨(문자열)
	 * @param cls 호출되는 엑티비티 클래스 
	 */
	public void addTab(String tag, String label, Class<?> cls)
	{
		mTabHost.addTab(mTabHost.newTabSpec(tag)
				.setIndicator(label)
				.setContent(new Intent(this, cls)));
	}
	
	/**
	 * Tab에 아이콘이 없을 경우 텍스트의 높에에 따라서 텝의 높이를 수정해 준다.
	 *
	 */
	public void noTabIConSetting()
	{
		for (int tab = 0; tab < mTabHost.getTabWidget().getChildCount(); ++tab) 
		{
			mTabHost.getTabWidget().getChildAt(tab).getLayoutParams().height = 100; 
			//Setting.TAB_WIDGET_HEIGHT;
		}
	}
	
	/**
	 * 클래스의 전체 경로에서 클래스 이름만 가져오는 클래스
	 * 
	 * @param cls 클래스
	 * @return 클래스명
	 */
	@SuppressWarnings("rawtypes")
	protected String getClassName(Class cls)
	{
		String FQClassName = cls.getName();
		int firstChar = FQClassName.lastIndexOf('.') + 1;
			
		if(firstChar > 0)
		{
			FQClassName = FQClassName.substring(firstChar);
		}
			
		return FQClassName;
	}
	
	/**
	 * 간편하게 사용할 수 있는 AlertDialog 메시지창
	 * 
	 * @param message 출력할 메시지
	 */
	protected void alert(String message)
	{
		MessageUtil.alert(this, message);
	}
	
	/**
	 * 간편하게 사용할 수 있는 Toast 메시지 창
	 * 
	 * @param message 출력할 메시지
	 */
	protected void toast(String message)
	{
		MessageUtil.toast(this, message);
	}
	
	/**
	 * 반영구적 어플리케이션 데이터를 보관하기 위한 SharedPreference 객체를 반환
	 * 
	 * @return SharedUtil 객체
	 */
	protected SharedUtil getSharedPreference()
	{
		return SharedUtil.getInstance();
	}
	
	/**
	 * 새로운 엑티비티에 넘길 변수를 추가합니다.
	 * 
	 * @param key 키
	 * @param value 값
	 */
	protected void putExtra(String key, String value)
	{
		mBaseExtras.putString(key, value);
	}
	
	/**
	 * 새로운 엑티비티에 넘길 변수를 추가합니다.
	 * 
	 * @param key 키
	 * @param value 값
	 */
	protected void putExtra(String key, int value)
	{
		mBaseExtras.putInt(key, value);
	}
	
	/**
	 * 새로운 엑티비티에 넘길 변수를 추가합니다.
	 * 
	 * @param key 키
	 * @param value 값
	 */
	protected void putExtra(String key, long value)
	{
		mBaseExtras.putLong(key, value);
	}
	
	/**
	 * 새로운 엑티비티에 넘길 변수를 추가합니다.
	 * 
	 * @param key 키
	 * @param value 값
	 */
	protected void putExtra(String key, double value)
	{
		mBaseExtras.putDouble(key, value);
	}
	
	/**
	 * 새로운 엑티비티에 넘길 변수를 추가합니다.
	 * 
	 * @param key 키
	 * @param value 값
	 */
	protected void putExtra(String key, boolean value)
	{
		mBaseExtras.putBoolean(key, value);
	}
	
	/**
	 * 새로운 엑티비티에 넘길 변수를 추가합니다.
	 * 
	 * @param key 키
	 * @param value 값
	 */
	protected void putExtra(String key, Serializable value)
	{
		mBaseExtras.putSerializable(key, value);
	}
	
	/**
	 * 새로운 엑티비티에 넘길 변수를 추가합니다.
	 * 
	 * @param key 키
	 * @param value 값
	 */
	protected void putExtra(String key, Parcelable value)
	{
		mBaseExtras.putParcelable(key, value);
	}
	
	/**
	 * 번들 변수의 값을 가져옵니다.
	 * 
	 * @param key 키
	 */
	protected String getExtraString(String key)
	{
		return mReceivedExtras.getString(key);
	}
	
	/**
	 * 번들 변수의 값을 가져옵니다.
	 * 
	 * @param key 키
	 * @param defaultValue 값이 없을 경우 기본값
	 */
	protected int getExtraInt(String key, int defaultValue)
	{
		return mReceivedExtras.getInt(key, defaultValue);
	}
	
	/**
	 * 번들 변수의 값을 가져옵니다.
	 * 
	 * @param key 키
	 * @param defaultValue 값이 없을 경우 기본값
	 */
	protected long getExtraLong(String key, long defaultValue)
	{
		return mReceivedExtras.getLong(key, defaultValue);
	}
	
	/**
	 * 번들 변수의 값을 가져옵니다.
	 * 
	 * @param key 키
	 * @param defaultValue 값이 없을 경우 기본값
	 */
	protected double getExtraDouble(String key, double defaultValue)
	{
		return mReceivedExtras.getDouble(key, defaultValue);
	}
	
	/**
	 * 번들 변수의 값을 가져옵니다.
	 * 
	 * @param key 키
	 * @param defaultValue 값이 없을 경우 기본값
	 */
	protected boolean getExtraBoolean(String key, boolean defaultValue)
	{
		return mReceivedExtras.getBoolean(key, defaultValue);
	}
	
	/**
	 * 번들 변수의 값을 가져옵니다.
	 * 
	 * @param key 키
	 */
	protected Serializable getExtraSerializable(String key)
	{
		return mReceivedExtras.getSerializable(key);
	}
	
	/**
	 * 번들 변수의 값을 가져옵니다.
	 * 
	 * @param key 키
	 */
	protected Parcelable getExtraParcelable(String key)
	{
		return mReceivedExtras.getParcelable(key);
	}
	
	@Override
	public void startActivity(Intent intent)
	{
		String action = intent.getAction();
		
		if(action != null && action.equals(Intent.ACTION_VIEW))
		{
			Uri uri = intent.getData();
			if(uri != null)
			{
				String scheme = uri.getScheme();
				String host = uri.getHost();
				
				String url = null;
				
				if(scheme.equals("market"))
				{
					String query = uri.getQuery();
					url = scheme + "://" + host + query;
				}
				else
				{
					String path = uri.getPath();
					url = scheme + "://" + host + path;
				}
				
				LOG.e("startActivity, url : " + url);
			}
			
			LOG.e("startActivity, Action is ACTION_VIEW");
		}
		super.startActivity(intent);
	}
}
